"""
风险监控页面
提供实时风险监控、预警、限额管理等功能
"""

import streamlit as st
import pandas as pd
import numpy as np
from datetime import datetime, timedelta
from typing import Dict, List, Any, Optional

from ..components.common import (
    create_sidebar_navigation, make_api_request, 
    display_loading_spinner, show_success_message, show_error_message
)
from ..components.metrics import create_metric_card, create_status_indicator
from ..components.charts import create_line_chart, create_bar_chart, create_gauge_chart
from ..components.tables import create_data_table, create_editable_table
from ..components.filters import create_date_filter, create_multiselect_filter


def render_risk_monitor_page():
    """渲染风险监控页面"""
    st.title("⚠️ 风险监控")
    
    # 侧边栏导航
    create_sidebar_navigation()
    
    # 创建标签页
    tab1, tab2, tab3, tab4, tab5 = st.tabs([
        "风险仪表板", "限额监控", "风险预警", "压力测试", "风险报告"
    ])
    
    with tab1:
        render_risk_dashboard_tab()
    
    with tab2:
        render_limit_monitoring_tab()
    
    with tab3:
        render_risk_alert_tab()
    
    with tab4:
        render_stress_test_tab()
    
    with tab5:
        render_risk_report_tab()


def render_risk_dashboard_tab():
    """渲染风险仪表板标签页"""
    st.header("风险仪表板")
    
    # 风险概览指标
    col1, col2, col3, col4 = st.columns(4)
    
    with col1:
        create_metric_card("风险等级", "中等", "⚠️", delta="", delta_color="normal")
    
    with col2:
        create_metric_card("VaR(95%)", "-2.3%", "📉", delta="+0.2%", delta_color="inverse")
    
    with col3:
        create_metric_card("最大回撤", "-8.5%", "📊", delta="+1.2%", delta_color="normal")
    
    with col4:
        create_metric_card("波动率", "16.8%", "📈", delta="-0.5%", delta_color="inverse")
    
    st.divider()
    
    # 风险仪表盘
    st.subheader("风险仪表盘")
    
    col1, col2, col3 = st.columns(3)
    
    with col1:
        # 风险等级仪表
        risk_level = 65  # 0-100的风险评分
        create_gauge_chart(
            value=risk_level,
            title="综合风险评分",
            min_val=0,
            max_val=100,
            ranges=[
                {"range": [0, 30], "color": "green", "label": "低风险"},
                {"range": [30, 70], "color": "yellow", "label": "中等风险"},
                {"range": [70, 100], "color": "red", "label": "高风险"}
            ]
        )
    
    with col2:
        # 流动性风险仪表
        liquidity_risk = 45
        create_gauge_chart(
            value=liquidity_risk,
            title="流动性风险",
            min_val=0,
            max_val=100,
            ranges=[
                {"range": [0, 30], "color": "green", "label": "充足"},
                {"range": [30, 70], "color": "yellow", "label": "一般"},
                {"range": [70, 100], "color": "red", "label": "紧张"}
            ]
        )
    
    with col3:
        # 集中度风险仪表
        concentration_risk = 75
        create_gauge_chart(
            value=concentration_risk,
            title="集中度风险",
            min_val=0,
            max_val=100,
            ranges=[
                {"range": [0, 30], "color": "green", "label": "分散"},
                {"range": [30, 70], "color": "yellow", "label": "适中"},
                {"range": [70, 100], "color": "red", "label": "集中"}
            ]
        )
    
    # 风险趋势图
    st.subheader("风险趋势")
    
    # 模拟风险趋势数据
    risk_trend = pd.DataFrame({
        '日期': pd.date_range(start='2024-01-01', end='2024-01-15', freq='D'),
        'VaR': [-1.8, -2.1, -2.3, -2.0, -2.5, -2.8, -2.3, -2.1, -1.9, -2.2, -2.4, -2.6, -2.3, -2.1, -2.3],
        '波动率': [15.2, 16.1, 16.8, 15.9, 17.2, 17.8, 16.8, 16.1, 15.5, 16.4, 16.9, 17.1, 16.8, 16.2, 16.8],
        '最大回撤': [-6.2, -7.1, -8.5, -7.8, -8.9, -9.2, -8.5, -7.9, -7.2, -8.1, -8.7, -8.9, -8.5, -8.0, -8.5]
    })
    
    create_line_chart(
        risk_trend,
        x_col='日期',
        y_col='VaR',
        title="VaR风险趋势",
        height=300
    )
    
    # 风险分解
    st.subheader("风险分解")
    
    col1, col2 = st.columns(2)
    
    with col1:
        # 风险因子贡献
        risk_factors = pd.DataFrame({
            '风险因子': ['市场风险', '信用风险', '流动性风险', '操作风险', '模型风险'],
            '贡献度': [65.2, 15.8, 12.3, 4.2, 2.5],
            '状态': ['中等', '低', '低', '低', '低']
        })
        
        create_bar_chart(
            risk_factors,
            x_col='风险因子',
            y_col='贡献度',
            title="风险因子贡献",
            height=300
        )
    
    with col2:
        # 行业风险贡献
        industry_risk = pd.DataFrame({
            '行业': ['食品饮料', '银行', '电子', '通信', '房地产'],
            '风险贡献': [28.5, 22.1, 18.6, 15.2, 8.9],
            '风险等级': ['中', '中', '中', '低', '高']
        })
        
        create_bar_chart(
            industry_risk,
            x_col='行业',
            y_col='风险贡献',
            title="行业风险贡献",
            height=300
        )
    
    # 实时风险监控
    st.subheader("实时风险监控")
    
    risk_monitoring = pd.DataFrame({
        '监控项目': ['组合VaR', '单股集中度', '行业集中度', '流动性比率', '杠杆比率'],
        '当前值': ['-2.3%', '39.6%', '48.4%', '24.9%', '0%'],
        '限额': ['-3.0%', '40.0%', '50.0%', '>20%', '<30%'],
        '使用率': ['76.7%', '99.0%', '96.8%', '124.5%', '0%'],
        '状态': ['正常', '接近限额', '接近限额', '超限', '正常'],
        '预警级别': ['绿色', '黄色', '黄色', '红色', '绿色']
    })
    
    create_data_table(risk_monitoring, "实时风险监控")


def render_limit_monitoring_tab():
    """渲染限额监控标签页"""
    st.header("限额监控")
    
    # 限额设置
    st.subheader("限额设置")
    
    col1, col2 = st.columns(2)
    
    with col1:
        st.write("**组合级别限额**")
        
        portfolio_limits = pd.DataFrame({
            '限额类型': ['总VaR限额', '最大回撤限额', '波动率限额', '杠杆比率限额'],
            '限额值': ['-3.0%', '-10.0%', '20.0%', '30.0%'],
            '当前值': ['-2.3%', '-8.5%', '16.8%', '0%'],
            '使用率': ['76.7%', '85.0%', '84.0%', '0%'],
            '状态': ['正常', '正常', '正常', '正常']
        })
        
        create_data_table(portfolio_limits, "组合限额")
    
    with col2:
        st.write("**个股级别限额**")
        
        stock_limits = pd.DataFrame({
            '限额类型': ['单股最大权重', '单股VaR贡献', '单股流动性要求'],
            '限额值': ['40.0%', '15.0%', '>1000万'],
            '违规数量': ['1只', '0只', '2只'],
            '状态': ['超限', '正常', '超限']
        })
        
        create_data_table(stock_limits, "个股限额")
    
    # 限额使用情况
    st.subheader("限额使用情况")
    
    limit_usage = pd.DataFrame({
        '限额名称': ['总VaR限额', '单股集中度', '行业集中度', '流动性比率', '信用风险限额'],
        '限额值': ['-3.0%', '40.0%', '50.0%', '20.0%', '5.0%'],
        '当前使用': ['-2.3%', '39.6%', '48.4%', '24.9%', '2.1%'],
        '使用率': [76.7, 99.0, 96.8, 124.5, 42.0],
        '剩余额度': ['-0.7%', '0.4%', '1.6%', '-4.9%', '2.9%'],
        '状态': ['正常', '接近限额', '接近限额', '超限', '正常']
    })
    
    # 使用率可视化
    create_bar_chart(
        limit_usage,
        x_col='限额名称',
        y_col='使用率',
        title="限额使用率",
        height=300
    )
    
    create_data_table(limit_usage, "限额使用详情")
    
    # 超限处理
    st.subheader("超限处理")
    
    if st.button("检查超限情况", type="primary"):
        exceeded_limits = limit_usage[limit_usage['使用率'] > 100]
        
        if not exceeded_limits.empty:
            st.error(f"发现 {len(exceeded_limits)} 项超限情况:")
            create_data_table(exceeded_limits, "超限项目")
            
            # 处理建议
            st.subheader("处理建议")
            
            for _, row in exceeded_limits.iterrows():
                with st.expander(f"处理 {row['限额名称']} 超限"):
                    if row['限额名称'] == '流动性比率':
                        st.write("**建议措施:**")
                        st.write("1. 减持部分股票增加现金比例")
                        st.write("2. 调整投资组合结构")
                        st.write("3. 设置止损点控制风险")
                        
                        if st.button(f"执行 {row['限额名称']} 调整", key=f"adjust_{row['限额名称']}"):
                            show_success_message(f"{row['限额名称']} 调整指令已发送")
        else:
            st.success("✅ 所有限额均在正常范围内")
    
    # 限额历史
    st.subheader("限额使用历史")
    
    # 模拟历史数据
    limit_history = pd.DataFrame({
        '日期': pd.date_range(start='2024-01-10', end='2024-01-15', freq='D'),
        'VaR使用率': [72.3, 75.1, 76.7, 78.2, 76.7, 74.5],
        '集中度使用率': [95.2, 97.1, 99.0, 98.5, 99.0, 96.8],
        '流动性使用率': [118.5, 122.3, 124.5, 126.1, 124.5, 121.2]
    })
    
    create_line_chart(
        limit_history,
        x_col='日期',
        y_col='VaR使用率',
        title="限额使用率历史趋势",
        height=300
    )


def render_risk_alert_tab():
    """渲染风险预警标签页"""
    st.header("风险预警")
    
    # 预警设置
    st.subheader("预警设置")
    
    col1, col2 = st.columns(2)
    
    with col1:
        st.write("**预警阈值设置**")
        
        warning_thresholds = pd.DataFrame({
            '预警项目': ['VaR预警', '回撤预警', '集中度预警', '流动性预警'],
            '黄色预警': ['80%', '80%', '85%', '90%'],
            '红色预警': ['95%', '90%', '95%', '100%'],
            '当前状态': ['绿色', '绿色', '黄色', '红色']
        })
        
        create_data_table(warning_thresholds, "预警阈值")
    
    with col2:
        st.write("**预警通知设置**")
        
        notification_settings = {
            "邮件通知": st.checkbox("启用邮件通知", value=True),
            "短信通知": st.checkbox("启用短信通知", value=True),
            "系统推送": st.checkbox("启用系统推送", value=True),
            "微信通知": st.checkbox("启用微信通知", value=False)
        }
        
        if st.button("保存通知设置"):
            show_success_message("通知设置已保存")
    
    # 当前预警
    st.subheader("当前预警")
    
    current_alerts = pd.DataFrame({
        '预警时间': ['2024-01-15 10:30', '2024-01-15 09:15', '2024-01-14 16:45'],
        '预警类型': ['流动性预警', '集中度预警', 'VaR预警'],
        '预警级别': ['红色', '黄色', '黄色'],
        '预警内容': ['流动性比率超限(124.5%)', '行业集中度接近限额(96.8%)', 'VaR使用率较高(76.7%)'],
        '状态': ['未处理', '已确认', '已处理'],
        '处理人': ['', '张三', '李四']
    })
    
    create_data_table(current_alerts, "当前预警")
    
    # 预警处理
    st.subheader("预警处理")
    
    selected_alert = st.selectbox("选择预警", current_alerts['预警内容'].tolist())
    
    col1, col2, col3 = st.columns(3)
    
    with col1:
        if st.button("确认预警", type="secondary"):
            show_success_message("预警已确认")
    
    with col2:
        if st.button("处理预警", type="primary"):
            show_success_message("预警处理完成")
    
    with col3:
        if st.button("忽略预警"):
            show_success_message("预警已忽略")
    
    # 预警统计
    st.subheader("预警统计")
    
    col1, col2 = st.columns(2)
    
    with col1:
        # 预警数量统计
        alert_stats = pd.DataFrame({
            '预警级别': ['红色预警', '黄色预警', '绿色提醒'],
            '今日': [1, 2, 5],
            '本周': [3, 8, 15],
            '本月': [8, 25, 42]
        })
        
        create_data_table(alert_stats, "预警数量统计")
    
    with col2:
        # 预警类型分布
        alert_types = pd.DataFrame({
            '预警类型': ['流动性预警', '集中度预警', 'VaR预警', '回撤预警', '其他'],
            '数量': [5, 8, 12, 3, 2],
            '占比': ['16.7%', '26.7%', '40.0%', '10.0%', '6.7%']
        })
        
        create_bar_chart(
            alert_types,
            x_col='预警类型',
            y_col='数量',
            title="预警类型分布",
            height=250
        )
    
    # 预警历史
    st.subheader("预警历史")
    
    # 模拟预警历史数据
    alert_history = pd.DataFrame({
        '日期': pd.date_range(start='2024-01-01', end='2024-01-15', freq='D'),
        '红色预警': [0, 1, 0, 2, 1, 0, 1, 0, 0, 1, 2, 1, 0, 1, 1],
        '黄色预警': [2, 3, 1, 4, 2, 3, 2, 1, 2, 3, 4, 3, 2, 2, 2],
        '绿色提醒': [5, 4, 6, 3, 5, 4, 5, 6, 4, 5, 3, 4, 5, 5, 5]
    })
    
    create_line_chart(
        alert_history,
        x_col='日期',
        y_col='红色预警',
        title="预警历史趋势",
        height=300
    )


def render_stress_test_tab():
    """渲染压力测试标签页"""
    st.header("压力测试")
    
    # 压力测试场景设置
    st.subheader("压力测试场景")
    
    col1, col2 = st.columns(2)
    
    with col1:
        st.write("**市场压力场景**")
        
        market_scenarios = st.multiselect(
            "选择市场场景",
            ["市场下跌10%", "市场下跌20%", "市场下跌30%", "波动率上升50%", "流动性危机"],
            default=["市场下跌10%", "市场下跌20%"]
        )
    
    with col2:
        st.write("**行业压力场景**")
        
        industry_scenarios = st.multiselect(
            "选择行业场景",
            ["银行业危机", "科技股暴跌", "消费降级", "房地产调控", "政策变化"],
            default=["银行业危机"]
        )
    
    # 自定义场景
    with st.expander("自定义压力场景"):
        custom_scenario = st.text_area("描述自定义场景")
        
        col1, col2, col3 = st.columns(3)
        with col1:
            market_shock = st.slider("市场冲击(%)", -50, 0, -15)
        with col2:
            volatility_increase = st.slider("波动率增加(%)", 0, 200, 50)
        with col3:
            liquidity_impact = st.slider("流动性影响(%)", -50, 0, -20)
    
    # 运行压力测试
    if st.button("运行压力测试", type="primary"):
        with st.spinner("正在运行压力测试..."):
            # 模拟压力测试过程
            progress_bar = st.progress(0)
            for i in range(100):
                progress_bar.progress(i + 1)
            
            st.session_state.stress_test_completed = True
            show_success_message("压力测试完成")
    
    # 压力测试结果
    if st.session_state.get('stress_test_completed', False):
        render_stress_test_results()


def render_stress_test_results():
    """渲染压力测试结果"""
    st.subheader("压力测试结果")
    
    # 整体影响
    col1, col2, col3, col4 = st.columns(4)
    
    with col1:
        st.metric("组合损失", "-12.5%", "-4.0%")
    
    with col2:
        st.metric("最大个股损失", "-25.8%", "-13.5%")
    
    with col3:
        st.metric("VaR变化", "-4.2%", "-1.9%")
    
    with col4:
        st.metric("预期恢复时间", "35天", "+20天")
    
    # 场景分析结果
    st.subheader("场景分析结果")
    
    scenario_results = pd.DataFrame({
        '压力场景': ['市场下跌10%', '市场下跌20%', '银行业危机', '流动性危机', '综合场景'],
        '组合损失': ['-8.5%', '-16.8%', '-6.2%', '-9.8%', '-12.5%'],
        '最大个股损失': ['-12.3%', '-24.6%', '-18.5%', '-15.2%', '-25.8%'],
        'VaR(95%)': ['-3.2%', '-5.8%', '-2.9%', '-3.8%', '-4.2%'],
        '恢复时间': ['15天', '45天', '25天', '30天', '35天'],
        '风险等级': ['中', '高', '中', '中', '高']
    })
    
    create_data_table(scenario_results, "场景分析结果")
    
    # 个股影响分析
    st.subheader("个股影响分析")
    
    stock_impact = pd.DataFrame({
        '股票': ['贵州茅台', '平安银行', '海康威视', '中兴通讯', '五粮液'],
        '当前权重': ['39.6%', '20.6%', '18.6%', '18.4%', '10.4%'],
        '市场下跌10%': ['-8.5%', '-12.3%', '-9.8%', '-10.2%', '-8.9%'],
        '市场下跌20%': ['-17.2%', '-24.6%', '-19.5%', '-20.8%', '-17.8%'],
        '银行业危机': ['-5.2%', '-18.5%', '-8.1%', '-7.8%', '-5.8%'],
        '综合场景': ['-12.8%', '-25.8%', '-15.2%', '-16.5%', '-13.5%']
    })
    
    create_data_table(stock_impact, "个股压力测试结果")
    
    # 风险建议
    st.subheader("风险管理建议")
    
    risk_recommendations = pd.DataFrame({
        '建议类型': ['仓位调整', '对冲策略', '流动性管理', '止损设置'],
        '具体建议': [
            '降低银行股权重至15%以下',
            '考虑购买看跌期权对冲',
            '提高现金比例至30%',
            '设置-15%止损线'
        ],
        '预期效果': [
            '降低行业集中风险',
            '减少下跌损失50%',
            '提高应对能力',
            '控制最大损失'
        ],
        '实施难度': ['中', '高', '低', '低']
    })
    
    create_data_table(risk_recommendations, "风险管理建议")


def render_risk_report_tab():
    """渲染风险报告标签页"""
    st.header("风险报告")
    
    # 报告生成
    st.subheader("生成风险报告")
    
    col1, col2, col3 = st.columns(3)
    
    with col1:
        report_type = st.selectbox("报告类型", [
            "日度风险报告", "周度风险报告", "月度风险报告", "压力测试报告", "限额监控报告"
        ])
    
    with col2:
        report_date = st.date_input("报告日期", datetime.now().date())
    
    with col3:
        report_format = st.selectbox("报告格式", ["PDF", "Excel", "Word"])
    
    if st.button("生成报告", type="primary"):
        with st.spinner("正在生成报告..."):
            # 模拟报告生成过程
            progress_bar = st.progress(0)
            for i in range(100):
                progress_bar.progress(i + 1)
            
            show_success_message(f"{report_type}已生成完成")
            
            # 提供下载链接
            st.download_button(
                label="下载报告",
                data="模拟报告内容",
                file_name=f"{report_type}_{report_date}.{report_format.lower()}",
                mime="application/octet-stream"
            )
    
    # 历史报告
    st.subheader("历史报告")
    
    historical_reports = pd.DataFrame({
        '报告名称': [
            '日度风险报告_2024-01-15',
            '周度风险报告_2024-01-14',
            '月度风险报告_2024-01-01',
            '压力测试报告_2024-01-10'
        ],
        '报告类型': ['日报', '周报', '月报', '专项'],
        '生成时间': [
            '2024-01-15 18:00',
            '2024-01-14 17:30',
            '2024-01-01 16:00',
            '2024-01-10 14:30'
        ],
        '文件大小': ['2.5MB', '5.8MB', '12.3MB', '8.9MB'],
        '状态': ['已完成', '已完成', '已完成', '已完成']
    })
    
    create_data_table(historical_reports, "历史报告")
    
    # 报告摘要
    st.subheader("最新风险报告摘要")
    
    with st.expander("日度风险报告摘要 (2024-01-15)"):
        st.write("**风险概况:**")
        st.write("- 组合整体风险水平：中等")
        st.write("- VaR(95%)：-2.3%，较昨日上升0.2%")
        st.write("- 最大回撤：-8.5%，在可接受范围内")
        st.write("- 波动率：16.8%，略低于历史平均水平")
        
        st.write("**主要风险点:**")
        st.write("- 流动性比率超限，需要关注")
        st.write("- 行业集中度较高，建议适当分散")
        st.write("- 个股集中度接近限额")
        
        st.write("**建议措施:**")
        st.write("- 适当增加现金比例")
        st.write("- 降低单一行业权重")
        st.write("- 加强流动性管理")
    
    # 风险指标趋势
    st.subheader("关键风险指标趋势")
    
    # 模拟风险指标历史数据
    risk_indicators = pd.DataFrame({
        '日期': pd.date_range(start='2024-01-01', end='2024-01-15', freq='D'),
        'VaR': [-1.8, -2.1, -2.3, -2.0, -2.5, -2.8, -2.3, -2.1, -1.9, -2.2, -2.4, -2.6, -2.3, -2.1, -2.3],
        '最大回撤': [-6.2, -7.1, -8.5, -7.8, -8.9, -9.2, -8.5, -7.9, -7.2, -8.1, -8.7, -8.9, -8.5, -8.0, -8.5],
        '波动率': [15.2, 16.1, 16.8, 15.9, 17.2, 17.8, 16.8, 16.1, 15.5, 16.4, 16.9, 17.1, 16.8, 16.2, 16.8]
    })
    
    create_line_chart(
        risk_indicators,
        x_col='日期',
        y_col='VaR',
        title="关键风险指标趋势",
        height=300
    )